跳到主要内容

基础数据操作之三 从"完备"到基础操作 select

关于完备

假如有人给我们出了一套数学题,但从来没有人教过我们怎样去做题,甚至连基础的操作运算符,加减乘除,我们都是不知道的,需要自己去发明。

出题的人知道答案,只要存在 "加一","减一" 这两个运算规则就可以解决这套题里面的所有问题。

我们开始不停的研究啊研究,终于发明出来 "加一" 这个运算规则,但可惜的是,"加一" 这个运算规则,只能解决那套题中的部分问题,还有一些问题无论如何只通过 "加一" 是没办法解决的。

这种情况下,我们所知道的规则,就是不完备的(解决不了这套数学题中的所有问题)。

我们接着研究,终于又发明出来 "减一" 这个运算规则,bingo! 这套数学题中的所有问题都解决了!我们发明的这两个规则就是完备的。

但我们觉得做题还是有点慢,于是又发明出来 "加二","减二" 等等方便运算的规则,在这种情况下,把之前所发明的整个规则加起来,也是完备的。后面发明出来的规则在遇到一些特定的问题时,会方便快捷一些,但如果没有这些规则,只通过 "加一","减一" 也是没有问题的。

另外一位同学,小T,和我们面对着同样一套数学题,但他的研究过程和你有些差异,他在研究出来 "加一" 规则之后,并没有发明出来 "减一" 这个规则,而是发明出来了 "加负一" 这个规则。小T拥有的这两个规则,也解决了这套数学题中的所有问题,虽然和我们的最终结果有所差异,但也是完备的。

以上就是完备的大概意思。在计算机中,有一种叫做图灵完备的概念。数学家艾伦·图灵(Alan Turing)发明了一台叫做"图灵机"的东西,这台机器能够计算可计算的一切问题。其他人发明出来的虚拟机或编程语言如果和 "图灵机" 一样计算可计算的一切问题,那么这样的虚拟机或编程语言就叫做图灵完备,或是图灵等价的。这个概念在计算机语言方面用的比较多。

会几种编程语言

也许我们曾遇到这样的问题,"你会几种编程语言?"。其实语言种类不是特别重要,只要我们理解一种编程语言,其他大部分的编程语言中基础的概念你就不用再学,只需要记记基本的格式就可以了。计算机程序无非就是赋值语句,判断分支语句,循环执行语句等。有了这些基本功能,这门语言就可以算"完备"了,有时这些语言会增加一些特别的功能方便用户使用,但其实,如果没有这些特别增加的功能,只使用一些基本功能,也是可以完成任务的。以上述完备例子中的数学题为例,如果我们走了 "加一","加负一" 的研究路线,那么在能解决现有问题的情况下,这就是一种 最小完备 的状态,不再投入时间等资源就是 最实用 的一种方式,提纲挈领说的就是这个意思。在其他学科中,可能会用正交,最小正交等词来表达近似概念。

这种思维方式我们会在后期有意无意的使用。

之前的作业

让我们从之前的数据和部分作业继续聊起。

示例数据

示例数据

  1. 想得到只有班级和姓名组成的新表;
  2. 想得到只有2班同学的新表;
  3. 想得到姓"李"的同学的新表;
  4. 想得到2班同学且只有班级和姓名组成的新表;
  5. 想把上一个问题中得到的表的表头 -- "班级" 改成 "班";

SQL是数据库的标准语言,逻辑,结构都比较清晰,里面的基础语法可以认为是我们上面所提到的操作数据的 最小完备 的语法。鉴于本系列在工具层面会侧重于 KNIME ,那么下面描述逻辑会将SQL的 最小完备 操作对应到 KNIME 中去,以期用最小的时间以及精力代价获得最大收益。

SQL的语法超级简单,但这种超级简单的语法却能派生出一些复杂的操作。我们先看 SELECT 这个语法。

SELECT in SQL

想遴选(select)数据出来,那么必须得知道从什么地方(from)去遴选什么(*),条件是什么(where)。

我们一般将select的操作分为以下两种以及它们的组合。

通过SELECT遴选整行

通过SELECT遴选整行

通过SELECT遴选特定列

通过SELECT遴选特定列

第一种,通过 SELECT 遴选整行

select * from sampleData where 1=1

其中的 "*" 代表了要选取那一行中所有的列,where后面的部分可以列写你的筛选条件,写"1=1"只是想在这里放一个占位符,示意这里放你的条件(只不过1=1这个条件是永远成立的)。比如你想要选出 "性别" 列中,元素值为"男"的列,那么你只需要写

select * from sampleData where 性别='男'

就可以得到你的结果了。

第二种,通过 SELECT 遴选特定列

select column1, column2 from sampleData

这句选择展示了 sampleData 表中名叫 column1 和 column2 的列。

好了,再看我们的作业用SQL的话怎么做:

  1. 想得到只有班级和姓名组成的新表; select 班级,姓名 from sampleData
  2. 想得到只有2班同学的新表; select * from sampleData where 班级=2
  3. 想得到姓"李"的同学的新表; select * from sampleData where 姓名 like "李%"
  4. 想得到2班同学且只有班级和姓名组成的新表; select 班级,姓名 from sampleData where 班级=2
  5. 想把上一个问题中得到的表的表头--"班级" 改成 "班"; select 班级 AS 班,姓名 from sampleData where 班级=2

SELECT in KNIME

对应于SQL中的select语句,KNIME要稍微麻烦一些(但带来了其他好处)。 我们上节已经把CSV文件导入到了 KNIME 中,这次只需要把对应的基本操作找出来就可以了。(在附录2中我们对 KNIME 有基本介绍。)对于之前图中"通过SELECT遴选整行"的情况,我们只需要把节点 Manipulation/Row/Filter/Row Filter 行过滤节点放进去就可以代替我们前面所说的 where 功能了。

KNIME中的row filter

KNIME中的row filter

可以从截图看到,row filter 行过滤节点支持各种条件过滤,比如选取符合某种条件的行,或是排除某种条件的行,普通的条件,通配符,正则表达式,或是范围条件,它都是支持的。

对于之前图中"通过SELECT遴选特定列"的情况,我们只需要把节点 Manipulation/Column/Filter/Column Filter节点放进去就可以代替我们前面所说的 select xxx,yyy 的功能了。

KNIME中的column filter

KNIME中的column filter

通过这两个节点的各种组合,就可以完成上面在SQL中完成的五道作业。第5题改表头的特殊要求,需要我们找到KNIME中的一个叫 column rename 改变列名的节点,组合进去就可以了。